#!/bin/bash
########################################################################
# 功能说明
## 基本的函数库，给其他脚本source使用的
########################################################################
PATH="${PATH}":/usr/local/bin/:/usr/local/etc/:/usr/local/lib/:/usr/local/lftp
export PATH
########################################################################
# 函 数 名  : init_env
# 功能描述  : 初始化全局变量，定义时间格式，建立目录
# 输入参数  : 无
# 返 回 值  : 无
########################################################################
function init_env
{
    PATH="${PATH}":/usr/local/bin/:/usr/local/etc/:/usr/local/lib/:/usr/local/lftp
    export PATH
    #脚本运行日期
    DAY=$(date +'%Y%m%d')
    HOUR=$(date +'%H')
    TIME=$(date +'%H%M%S')
    FILE_TIME=$(date '+%Y%m%d%H%M%S')
    #脚本名，去.sh后缀
    SCRIPT_NAME="$(basename $0 .sh)"
    #脚本安装路径
    DIR_INSTALL=$(cd $(dirname $0);pwd)
    FILE_CONF="${DIR_INSTALL}/config/cluster.conf"
    source ${FILE_CONF}
    #安装日志目录路径
    DIR_LOG="${DIR_INSTALL}/logs"
    mkdir -p ${DIR_LOG}
    #安装前历史文件备份目录路径
    #DIR_BAK="${DIR_INSTALL}/bak/${DAY}${TIME}"
    #mkdir -p ${DIR_BAK}
    #脚本运行正常日志
    LOG_NORMAL="${DIR_LOG}/${SCRIPT_NAME}_${DAY}.log"
    #脚本运行错误日志
    LOG_ERROR="${DIR_LOG}/${SCRIPT_NAME}_${DAY}.err"
    # exec 2>"${LOG_ERROR}"

}
########################################################################
# 函 数 名  : Echo
# 功能描述  : 将信息写入脚本运行日志
# 输入参数  : 1：需写入信息
# 返 回 值  : 无
# 调用函数  : 无
########################################################################
function Echo
{
    LOGTIME=$(date '+%Y-%m-%d %H:%M:%S')
    if (($# == 2));then
        message=$1
        logType=$2
        if [ ${logType} == 1 ]; then
            echo -e "$LOGTIME INFO ${SCRIPT_NAME}:${message}" >> "${LOG_NORMAL}"
            echo "$LOGTIME INFO ${SCRIPT_NAME}:${message}"
        else
            if [ ${logType} == 2 ]; then
                echo -e "$LOGTIME WARN ${SCRIPT_NAME}:${message}" >> "${LOG_NORMAL}"
                echo  "$LOGTIME WARN ${SCRIPT_NAME}:${message}"
            else
                echo -e "$LOGTIME ERROR ${SCRIPT_NAME}:${message}" >> "${LOG_NORMAL}"
                echo "$LOGTIME ERROR ${SCRIPT_NAME}:${message}"
            fi
        fi
    else
        echo -e "Function[Echo] usage error" >> "${LOG_ERROR}"
    fi
}
########################################################################
# 函 数 名  : PrintUsage
# 功能描述  : 打印使用方法
# 输入参数  : 无
# 返 回 值  : 无
########################################################################
function PrintUsage
{
  echo "Usage: install COMMAND"
  echo "单独安装某一个模块，用特定模块名称"
  echo "  where COMMAND is one of:"
  echo "  -----------------------------------------"
  echo "  install_dependency  在本节点安装Ansible、Expect等依赖工具"
  echo "  structure_hosts     构建Ansible hosts 配置 并配置 各节点的 hostname"
  #echo "  prepare             检测和配置环境参数"
  echo "  install             安装zookeeper、clickhouse"
  echo "  start               启动cickhouse"
  echo "  status              查看clickhouse服务"
  echo "  restart             重启clickhouse服务"
  echo "  stop                停止clickhouse服务"
  echo "  uninstall           卸载clickhouse服务"
  echo "  test                clickhouse简单测试"
  echo "  export              从clickhouse导出数据"
  echo "  import              将数据导入clickhouse"
  echo "  addNodes            新增clickhouse节点"
  echo "  backups             备份所有的clickhouse节点"
  echo "  restore             恢复所有的clickhouse节点"
  echo "  -----------------------------------------"
  echo ""
}


########################################################################
# 函 数 名  : Boot
# 功能描述  : 根据输入的变量，执行对应的安装程序
# 输入参数  : 无
# 返 回 值  : 无
########################################################################
function Boot
{
    cd ${DIR_INSTALL}
    bootname=$1
    case $bootname in
      "install_dependency")
        sh $DIR_INSTALL/bin/install_dependency.sh
        ;;
      "structure_hosts")
        sh $DIR_INSTALL/bin/base.sh structure_hosts
        ansible all_clickhouse -i $DIR_INSTALL/config/.hosts -m hostname -a "name={{ hostname }} use=systemd"
        ;;
      "install")
        sh $DIR_INSTALL/bin/base.sh install

        if [ $? != 0 ];then
            Echo "执行base.sh 脚本出现异常,请根据错误进行排查,即将退出" 3
            exit 2
        else
            Echo "检测和配置环境参数工作完成,完成状态为成功" 1
        fi
        /usr/bin/ansible-playbook $DIR_INSTALL/playbooks/clickhouse.yml -i $DIR_INSTALL/config/.hosts --skip-tags "stop,restart,uninstall,test,export,import"

        #Echo "开始检测和配置环境参数" 1
        #/usr/bin/ansible-playbook $DIR_INSTALL/playbooks/clickhouse.yml -i $DIR_INSTALL/config/.hosts --tags "prepare"
        #if [ $? != 0 ];then
        #    Echo "检测和配置环境参数工作出现异常,请根据错误进行排查" 3
        #    exit 2
        #else
        #    Echo "检测和配置环境参数工作完成,完成状态为成功" 1
        #fi
#
        #Echo "INFO: 开始进行clickhouse安装" 1
        #/usr/bin/ansible-playbook $DIR_INSTALL/playbooks/clickhouse.yml -i $DIR_INSTALL/config/.hosts --tags "install_by_file"
        #if [ $? != 0 ];then
        #    Echo "在所有节点上执行安装出现异常,请根据错误进行排查" 3
        #else
        #    Echo "在所有节点上执行安装工作完成,完成状态为成功" 1
        #fi
#
        #Echo "INFO: 开始进行clickhouse配置" 1
        #/usr/bin/ansible-playbook $DIR_INSTALL/playbooks/clickhouse.yml -i $DIR_INSTALL/config/.hosts --tags "config"
        #if [ $? != 0 ];then
        #    Echo "在所有节点上执行配置出现异常,请根据错误进行排查" 3
        #else
        #    Echo "在所有节点上执行配置工作完成,完成状态为成功" 1
        #fi
#
        #Echo "INFO: 启动所有节点的 clickhouse-server 服务" 1
        #/usr/bin/ansible-playbook $DIR_INSTALL/playbooks/clickhouse.yml -i $DIR_INSTALL/config/.hosts --tags "start"
        #if [ $? != 0 ];then
        #    Echo "启动所有节点的 clickhouse-server 服务出现异常,请根据错误进行排查" 3
        #else
        #    Echo "启动所有节点的 clickhouse-server 服务完成,完成状态为成功" 1
        #fi
        ;;
      "start")
        sh $DIR_INSTALL/bin/base.sh start
        if [ $? != 0 ];then
            Echo "执行base.sh 脚本出现异常,请根据错误进行排查,即将退出" 3
            exit 2
        else
            Echo "检测和配置环境参数工作完成,完成状态为成功" 1
        fi
         Echo "INFO: 启动所有节点的 clickhouse-server 服务" 1
        /usr/bin/ansible-playbook $DIR_INSTALL/playbooks/clickhouse.yml -i $DIR_INSTALL/config/.hosts --tags "start"
        if [ $? != 0 ];then
            Echo "启动所有节点的 clickhouse-server 服务出现异常,请根据错误进行排查" 3
        else
            Echo "启动所有节点的 clickhouse-server 服务完成,完成状态为成功" 1
        fi
        ;;
      "status")
        sh $DIR_INSTALL/bin/base.sh status
        if [ $? != 0 ];then
            Echo "执行base.sh 脚本出现异常,请根据错误进行排查,即将退出" 3
            exit 2
        else
            Echo "检测和配置环境参数工作完成,完成状态为成功" 1
        fi
        Echo "INFO: 查看 clickhouse-server 服务状态" 1
        /usr/bin/ansible-playbook $DIR_INSTALL/playbooks/clickhouse.yml -i $DIR_INSTALL/config/.hosts --tags "status"
        if [ $? != 0 ];then
            Echo "查看 clickhouse-server 服务状态出现异常,请根据错误进行排查" 3
        else
            Echo "查看 clickhouse-server 服务状态完成,完成状态为成功" 1
        fi
        ;;
      "restart")
        sh $DIR_INSTALL/bin/base.sh restart
        if [ $? != 0 ];then
            Echo "执行base.sh 脚本出现异常,请根据错误进行排查,即将退出" 3
            exit 2
        else
            Echo "检测和配置环境参数工作完成,完成状态为成功" 1
        fi
        Echo "INFO: 重启 clickhouse-server 服务" 1
        /usr/bin/ansible-playbook $DIR_INSTALL/playbooks/clickhouse.yml -i $DIR_INSTALL/config/.hosts --tags "restart"
        if [ $? != 0 ];then
            Echo "重启 clickhouse-server 服务出现异常,请根据错误进行排查" 3
        else
            Echo "重启 clickhouse-server 服务完成,完成状态为成功" 1
        fi
        ;;
      "stop")
        sh $DIR_INSTALL/bin/base.sh stop
        if [ $? != 0 ];then
            Echo "执行base.sh 脚本出现异常,请根据错误进行排查,即将退出" 3
            exit 2
        else
            Echo "检测和配置环境参数工作完成,完成状态为成功" 1
        fi
        Echo "INFO: 停止clickhouse服务" 1
        /usr/bin/ansible-playbook $DIR_INSTALL/playbooks/clickhouse.yml -i $DIR_INSTALL/config/.hosts --tags "stop"
        if [ $? != 0 ];then
            Echo "停止 clickhouse-server 服务出现异常,请根据错误进行排查" 3
        else
            Echo "停止 clickhouse-server 服务完成,完成状态为成功" 1
        fi
        ;;
      "uninstall")
        sh $DIR_INSTALL/bin/base.sh uninstall
        if [ $? != 0 ];then
            Echo "执行base.sh 脚本出现异常,请根据错误进行排查,即将退出" 3
            exit 2
        else
            Echo "检测和配置环境参数工作完成,完成状态为成功" 1
        fi
        echo -n "您确定要卸载Clickhouse集群？请输入确认信息 y|n:"
        orderFlag=""
        while true
        do
            read -r -p "Are You Sure? [Y/n] " input
            case $input in
                [yY][eE][sS]|[yY])
                orderFlag="true"
                break
                ;;

                [nN][oO]|[nN])
                orderFlag="false"
                break
                ;;

                *)
                echo "输入不合法,请输入[Y/N]..."
                ;;
            esac
            sleep 1;
        done

        if [[ $orderFlag = "true" ]]
        then
            Echo "(1/5)您输入了yes,即将执行卸载Clickhouse集群的命令！" 1
        else
            Echo "(1/5)您输入了no,即将退出" 1
            exit 5
        fi
        Echo "INFO: 卸载clickhouse服务" 1
        /usr/bin/ansible-playbook $DIR_INSTALL/playbooks/clickhouse.yml -i $DIR_INSTALL/config/.hosts --tags "uninstall"
        if [ $? != 0 ];then
            Echo "卸载clickhouse服务出现异常,请根据错误进行排查" 3
        else
            Echo "卸载clickhouse服务完成,完成状态为成功" 1
        fi
        ;;
      "test")
        sh $DIR_INSTALL/bin/base.sh test
        if [ $? != 0 ];then
            Echo "执行base.sh 脚本出现异常,请根据错误进行排查,即将退出" 3
            exit 2
        else
            Echo "检测和配置环境参数工作完成,完成状态为成功" 1
        fi
        Echo "INFO: 测试clickhouse服务是否正常" 1
        /usr/bin/ansible-playbook $DIR_INSTALL/playbooks/clickhouse.yml -i $DIR_INSTALL/config/.hosts --tags "test"
        if [ $? != 0 ];then
            Echo "测试clickhouse服务出现异常,请根据错误进行排查" 3
        else
            Echo "测试clickhouse服务完成,完成状态为成功" 1
        fi
        ;;
        "import")
        sh $DIR_INSTALL/bin/base.sh import
        if [ $? != 0 ];then
            Echo "执行base.sh 脚本出现异常,请根据错误进行排查,即将退出" 3
            exit 2
        else
            Echo "检测和配置环境参数工作完成,完成状态为成功" 1
        fi
        Echo "开始数据导入的逻辑 $importDataMode" 1
        if [[ $importDataMode -eq 0 ]];then
            Echo "检测到数据导入指定的模式为当前节点" 1
            sh $DIR_INSTALL/bin/ex_im_data.sh $importDataMode import
        elif [[ $importDataMode -eq 1 ]];then
            Echo "检测到数据导入指定的模式为所有节点" 1
            /usr/bin/ansible-playbook $DIR_INSTALL/playbooks/clickhouse.yml -i $DIR_INSTALL/config/.hosts --tags "import"
            if [ $? != 0 ];then
                Echo "数据导入出现异常,请根据错误进行排查" 3
            else
                Echo "数据导入完成,完成状态为成功" 1
            fi
        else
            Echo "检测到数据导出指定的模式 importDataMode=$importDataMode 无法识别,请重新配置" 3
            exit 2
        fi
        ;;
        "export")
        sh $DIR_INSTALL/bin/base.sh export
        if [ $? != 0 ];then
            Echo "执行base.sh 脚本出现异常,请根据错误进行排查,即将退出" 3
            exit 2
        else
            Echo "检测和配置环境参数工作完成,完成状态为成功" 1
        fi
        Echo "开始数据导出的逻辑" 1
        if [[ $exportDataMode -eq 0 ]];then
            Echo "检测到数据导出指定的模式为当前节点" 1
            sh $DIR_INSTALL/bin/ex_im_data.sh $exportDataMode export
        elif [[ $exportDataMode -eq 1 ]];then
            Echo "检测到数据导出指定的模式为所有节点" 1
            /usr/bin/ansible-playbook $DIR_INSTALL/playbooks/clickhouse.yml -e FILE_TIME=$FILE_TIME -i $DIR_INSTALL/config/.hosts --tags "export"
            if [ $? != 0 ];then
                Echo "数据导出出现异常,请根据错误进行排查" 3
            else
                Echo "数据导出完成,完成状态为成功" 1
            fi
        else
            Echo "检测到数据导出指定的模式 exportDataMode=$exportDataMode 无法识别,请重新配置" 3
            exit 2
        fi
        ;;
      "addNodes")
        ls $DIR_INSTALL/roles/clickhouse/vars/.main.yml
        if [ $? != 0 ];then
            Echo ".main.yml文件不存在，进行复制操作" 1
			## 复制main.yml文件为.main.yml
            cp $DIR_INSTALL/roles/clickhouse/vars/main.yml $DIR_INSTALL/roles/clickhouse/vars/.main.yml
        else
            Echo ".main.yml文件已存在，继续运行" 1
        fi

        Echo "开始进行新增节点检测和配置工作" 1
        sh $DIR_INSTALL/bin/base.sh addNodes
        if [ $? != 0 ];then
            Echo "执行base.sh 脚本出现异常,请根据错误进行排查,即将退出" 3
            exit 2
        else
            Echo "新增节点检测和配置工作完成,完成状态为成功" 1
        fi

        Echo "开始检测和配置环境参数" 1
        /usr/bin/ansible-playbook $DIR_INSTALL/playbooks/addclickhouse.yml -i $DIR_INSTALL/config/.addNodeHosts --tags "prepare"
        if [ $? != 0 ];then
            Echo "检测和配置环境参数工作出现异常,请根据错误进行排查" 3
            exit 2
        else
            Echo "检测和配置环境参数工作完成,完成状态为成功" 1
        fi

        Echo "INFO: 开始进行新增clickhouse节点安装" 1
        /usr/bin/ansible-playbook $DIR_INSTALL/playbooks/addclickhouse.yml -i $DIR_INSTALL/config/.addNodeHosts --tags "install_by_file"
        if [ $? != 0 ];then
            Echo "在新增节点上执行安装出现异常,请根据错误进行排查" 3
        else
            Echo "在新增节点上执行安装完成,完成状态为成功" 1
            ## 只有当新增节点安装成功后才把.main.yml文件删除
            rm -rf $DIR_INSTALL/roles/clickhouse/vars/.main.yml
        fi

        Echo "INFO: 更新所有clickhouse节点配置文件" 1
        /usr/bin/ansible-playbook $DIR_INSTALL/playbooks/clickhouse.yml -i $DIR_INSTALL/config/.hosts --tags "config"
        if [ $? != 0 ];then
            Echo "在更新所有clickhouse节点配置文件出现异常,请根据错误进行排查" 3
        else
            Echo "在更新所有clickhouse节点配置文件工作完成,完成状态为成功" 1
        fi

        Echo "INFO: 启动新增节点的 clickhouse-server 服务" 1
        /usr/bin/ansible-playbook $DIR_INSTALL/playbooks/addclickhouse.yml -i $DIR_INSTALL/config/.addNodeHosts --tags "start"
        if [ $? != 0 ];then
            Echo "启动新增节点的 clickhouse-server 服务出现异常,请根据错误进行排查" 3
        else
            Echo "启动新增节点的 clickhouse-server 服务完成,完成状态为成功" 1
        fi
        ;;
		"backups")
        sh $DIR_INSTALL/bin/base.sh backups
        if [ $? != 0 ];then
            Echo "执行base.sh 脚本出现异常,请根据错误进行排查,即将退出" 3
            exit 2
        else
            Echo "检测和配置环境参数工作完成,完成状态为成功" 1
        fi
		Echo "INFO: 停止clickhouse服务" 1
        /usr/bin/ansible-playbook $DIR_INSTALL/playbooks/clickhouse.yml -i $DIR_INSTALL/config/.hosts --tags "stop"

        Echo "INFO: 备份 clickhouse-server 服务的所有内容" 1
        /usr/bin/ansible-playbook $DIR_INSTALL/playbooks/bak_restore.yml -i $DIR_INSTALL/config/.hosts --tags "backups"
        if [ $? != 0 ];then
            Echo "备份 clickhouse-server 服务的所有内容,请根据错误进行排查" 3
        else
            Echo "备份 clickhouse-server 服务的所有内容,完成状态为成功" 1
        fi;;
		"restore")
        sh $DIR_INSTALL/bin/base.sh backups
        if [ $? != 0 ];then
            Echo "执行base.sh 脚本出现异常,请根据错误进行排查,即将退出" 3
            exit 2
        else
            Echo "检测和配置环境参数工作完成,完成状态为成功" 1
        fi

        Echo "INFO: 备份 clickhouse-server 服务的所有内容" 1
        /usr/bin/ansible-playbook $DIR_INSTALL/playbooks/bak_restore.yml -i $DIR_INSTALL/config/.hosts --tags "restore"
        if [ $? != 0 ];then
            Echo "备份 clickhouse-server 服务的所有内容,请根据错误进行排查" 3
        else
            Echo "备份 clickhouse-server 服务的所有内容,完成状态为成功" 1
        fi
        ;;
      *)
        PrintUsage
        ;;
    esac
}
########################################################################
# BEGINNING OF MAIN
########################################################################
init_env
if [[ $# == 1 ]]
then
   Boot $1
else
   PrintUsage
fi
########################################################################
# End of script
########################################################################
